perm filename PGFAI.FAI[VIS,HPM]2 blob sn#423205 filedate 1979-03-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	PGFAI
C00004 00003	T←0 ↔ YLO←←1 ↔ XLO←←2 ↔ YHI←←3 ↔ XHI←←4 ↔ PIC←7
C00006 00004	BITUP PMIDI PBSK XLMSK XRMSK
C00007 00005	HORUP
C00009 00006	VERUP:	0				ROUTINE FOR MAKING A VERTICAL
C00010 00007	DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
C00014 00008	XL:	0.0
C00016 00009	XLITEN XDRKEN XINVEN
C00017 00010	PDOT:	SAVAC(10)
C00018 00011	PLINE:	SAVAC(16)		DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
C00019 00012		EXTERN	$$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
C00021 00013	SAVN:	0
C00026 00014		END
C00027 ENDMK
C⊗;
	TITLE	PGFAI
		       ;MAKES LINES AND THINGS IN ONE BIT PICTURES
	ENTRY	PDDINI,PSCREE,PSCREM,PLINE,PDOT,PPOLYG
	ENTRY	PDRKEN,PLITEN,PINVEN
	ENTRY	PBSK,PMIDI

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←13
LINTAB←←14

PIC←7
P←17 

NWDS:	   0		;number of words in scanline, including border
XLOO:0		;X offset
XLOL:0		;left limit
XHIL:0		;right limit

YLOO:0		;Y offset
YLOL:0		;top limit
YHIL:0		;bottom limit

NLINA:0		;virtual buffer height for SCREEN calculation
NBITA:0		;virtual width

RETAD:	0
ACS:	BLOCK	20

	DEFINE	SAVAC(N)
<	IFGE	N-12,{MOVEM 12,ACS+12}
	IFGE	N-16,{MOVEM 16,ACS+16}
	IFGE	N-17,{MOVEM 17,ACS+17}	>

	DEFINE	RESAC(N)
<	IFGE	N-12,{MOVE 12,ACS+12}
	IFGE	N-16,{MOVE 16,ACS+16}
	IFGE	N-17,{MOVE 17,ACS+17}	>

	define fix(x)<kifix x,x>
T←0 ↔ YLO←←1 ↔ XLO←←2 ↔ YHI←←3 ↔ XHI←←4 ↔ PIC←7

PDDINI: POP	P,RETAD
	POP	P,XHI
	POP	P,YHI
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
 	CAMLE	XLO,XHI
	EXCH	XLO,XHI
	CAMLE	YLO,YHI
	EXCH	YLO,YHI

	MOVE	T,YHI		;height, for SCREEN calculation
	SUB	T,YLO
	ADDI	T,1
	MOVEM	T,NLINA

	MOVE	T,XHI		;width, for SCREEN calculation
	SUB	T,XLO
	ADDI	T,1
	MOVEM	T,NBITA

	MOVEM	XLO,XLOO	;X offset for deposits
	MOVEM	YLO,YLOO	;Y offset

	CAIGE	XLO,0
	MOVEI	XLO,0
	MOVEM	XLO,XLOL	;physical left limit
	
	CAIGE	YLO,0
	MOVEI	YLO,0
	MOVEM	YLO,YLOL	;physical top limit

	MOVE	T,LNBY(PIC)
	SUBI	T,1
	CAMLE	XHI,T
	MOVE	XHI,T
	MOVEM	XHI,XHIL	;physical right limit

	MOVE	T,PCLN(PIC)
	SUBI	T,1
	CAMLE	YHI,T
	MOVE	YHI,T
	MOVEM	YHI,YHIL	;pyhsical bottom limit

	MOVE	YLO,LNWD(PIC)
	MOVEM	YLO,NWDS		;save scanlinesize
	IMUL	YLO,YLOO		
        MOVE	T,LINTAB(PIC)
	ADD	T,YLO		;Y offset can be done implicitly
	HRRM	T,PMIDI

	MOVN	YLO,YLOO
	ADDM	YLO,YLOL
	ADDM	YLO,YHIL

	JRST	@RETAD
;BITUP PMIDI PBSK XLMSK XRMSK
X1←1 ↔  XA←2 ↔  X2←3 ↔  XB←4 ↔ Y1←5 ↔  Y2←11


XRMSK:	FOR I←0,43,1 {	(-1)⊗(-I) 
					   }

XLMSK:	FOR I←0,43,1 {	¬(377777777777⊗(-I))
						    }

PBSK:	FOR I←0,43,1 {	400000000000 ⊗ (-I)
						}


BITUP:	0				;ROUTINE FOR PLACING A BIT AT (X1,Y1)
	CAML	Y1,YLOL
	CAMLE	Y1,YHIL
	JRST	@BITUP
	ADD	X1,XLOO
	CAML	X1,XLOL
	CAMLE	X1,XHIL
	JRST	@BITUP
	IDIVI	X1,44
	MOVE	10,PBSK(XA)
        IMUL	Y1,NWDS
	ADD	X1,Y1
PMIDI:	ORM	10,(X1)
	JRST	@BITUP
;HORUP
HORUP:	0				;ROUTINE FOR PUTTING UP A HORIZONTAL
	CAML	Y1,YLOL			;LINE AT Y1, BETWEEN X1 AND X2
	CAMLE	Y1,YHIL
	JRST	@HORUP
	ADD	X1,XLOO
	ADD	X2,XLOO
	CAMLE	X1,X2
	EXCH	X1,X2
	CAML	X2,XLOL
	CAMLE	X1,XHIL
	JRST	@HORUP
	CAMGE	X1,XLOL
	MOVE	X1,XLOL
	CAMLE	X2,XHIL
	MOVE	X2,XHIL
	IDIVI	X1,44
	IDIVI	X2,44
	MOVE	10,XRMSK(XA)
	SUB	X2,X1
	MOVE	0,Y1
        IMUL	0,NWDS
	ADD	X1,0

	JUMPG	X2,NOTE
	AND	10,XLMSK(XB)
	XCT	PMIDI
	JRST	@HORUP
NOTE:	XCT	PMIDI
	SETO	10,
LMDL:	AOS	X1
	SOJLE	X2,FINE
	XCT	PMIDI
	AOJA	X1,LMDL+1
FINE:	MOVE	10,XLMSK(XB)
	XCT	PMIDI
	JRST	@HORUP
VERUP:	0				;ROUTINE FOR MAKING A VERTICAL
	ADD	X1,XLOO
	CAML	X1,XLOL			;LINE AT X1 BETWEEN Y1 AND Y2
	CAMLE	X1,XHIL
	JRST	@VERUP
	CAML	Y1,Y2
	EXCH	Y1,Y2
	CAML	Y2,YLOL
	CAMLE	Y1,YHIL
	JRST	@VERUP
	CAMGE	Y1,YLOL
	MOVE	Y1,YLOL
	CAMLE	Y2,YHIL
	MOVE	Y2,YHIL
	SUBI	Y2,1
	IDIVI	X1,44
	MOVE	10,PBSK(XA)
	MOVE	0,Y1
	IMUL	0,NWDS
	ADD	X1,0
VLP:	XCT	PMIDI
	CAML	Y1,Y2
	JRST	@VERUP
	ADD	X1,NWDS
	AOJA	Y1,VLP
DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
OBLUP:	0				;ROUTINE FOR DRAWING AN OBLIQUE
	SUB	X2,X1			;LINE FROM (X1,Y1) TO (X2,Y2)
	SUB	Y2,Y1
	MOVM	XLO,X2
	MOVM	YLO,Y2
	MOVEI	DELT,400000
	CAMLE	XLO,YLO
	JRST	DXGR
DYGR:	JUMPGE	X2,DYPDXL
	MOVN	X2,X2
	MOVN	Y2,Y2
	SUB	X1,X2
	SUB	Y1,Y2
DYPDXL:	HRL	DELT,Y2
	AOS	DIND,X2
	IDIV	DELT,X2
	HRLZ	YLO,Y1
	MOVE	XLO,X1
SGLP:	MOVE	Y2,DELT
	ADDB	YLO,Y2
	HLRE	Y2,Y2
	JSR	VERUP
	SOJLE	DIND,@OBLUP
	AOS	X1,XLO
	HLRE	Y1,YLO
	JRST	SGLP
DXGR:	JUMPGE	Y2,DYPDXG
	MOVN	X2,X2
	MOVN	Y2,Y2
	SUB	X1,X2
	SUB	Y1,Y2
DYPDXG:	HRL	DELT,X2
	AOS	DIND,Y2
	IDIV	DELT,Y2
	HRLZ	XLO,X1
	MOVE	YLO,Y1
SIGLP1:	MOVE	X2,DELT
	ADDB	X2,XLO
	HLRE	X2,X2
	JSR	HORUP
	SOJLE	DIND,@OBLUP
	AOS	Y1,YLO
	HLRE	X1,XLO
	JRST	SIGLP1
XL:	0.0
XH:	1.0
XSC:	1476.0
YL:	0.0
YH:	1.0
YSC:	2048.0

PSCREE:	SAVAC(3)		;SET UP SCREEN DIMENSIONS
	POP	P,RETAD		;SCREEN(XL,YL,XH,YH)
	POP	P,YL		;DEFAULT XL=0.0 YH=1.0
	POP	P,XH		;	 YL=0.0 YH=1.0
	POP	P,YH
	POP	P,XL
	MOVE	1,XH
	FSBR	1,XL
	FLTR	3,NBITA
	FMPR	3,[0.9999]
	FDVR	3,1
	MOVEM	3,XSC
	MOVE	1,YH
	FSBR	1,YL
	FLTR	3,NLINA
	FMPR	3,[0.9999]
	FDVR	3,1
	MOVEM	3,YSC
	RESAC(3)
	JRST	@RETAD

PSCREM:	POP	P,RETAD
	POP	P,1
	MOVE	2,YL
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,XH
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,YH
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,XL
	MOVEM	2,(1)
        JRST	@RETAD
;XLITEN XDRKEN XINVEN
PLITEN:	MOVE	1,[ ORM 10,(X1)]	;OUTPUTS TO APPEAR BRIGHT
	HLLM	1,PMIDI			;(ACTUALLY DARK TONER ON XGP)
	POPJ	P,

PDRKEN:	MOVE	1,[ ANDCAM 10,(X1)]	 ;OUTPUTS DARK
	HLLM	1,PMIDI			 ;(WHITE, ACTUALLY, PAPER SHOWS THRU)
	POPJ	P,

PINVEN:	MOVE	1,[ XORM 10,(X1)]	;OUTPUTS TO NEGATE PREVIUS DISPLAY
	HLLM	1,PMIDI
	POPJ	P,
PDOT:	SAVAC(10)
	POP	P,RETAD
	POP	P,Y1
	FSBR	Y1,YL
	FMPR	Y1,YSC
	FIX	Y1
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1
	JSR	BITUP
	RESAC(10)
	JRST	@RETAD
PLINE:	SAVAC(16)		;DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
	POP	P,RETAD
	POP	P,Y2
	FSBR	Y2,YL
	FMPR	Y2,YSC
	FIX	Y2
	POP	P,X2		;LINE(X1,Y1,X2,Y2)
	FSBR	X2,XL
	FMPR	X2,XSC
	FIX	X2
	POP	P,Y1
	FSBR	Y1,YL
	FMPR	Y1,YSC
	FIX	Y1
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1
	JSR	OBLUP
	RESAC(16)
	JRST	@RETAD

	EXTERN	$$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS

X1←1 ↔  XA←2  ↔ JJ←2
X2←3 ↔  XB←4  ↔ T←4
Y1←5
Y2←←6
I←←7
II←←12
N←13
J←←14
TT←←15
TTT←←16
P←17

PPOLYG: movem	12,ac12#	;FILL IN AN N SIDED POLYGON
	movem	16,ac16#
	POP	P,RETAD		; POLYGO(N,X,Y)
	POP	P,Y2		;  X AND Y ARE EACH CONTIGUOUS ARRAYS
	POP	P,X2
	POP	P,N
	HRRZ	T,N
	MOVE	N,T
LFL:	MOVE	TT,(X2)
	FSBR	TT,XL
	FMPR	TT,XSC
	FIX	TT
	MOVEM	TT,$$$PX(T)
	MOVE	TT,(Y2)
	FSBR	TT,YL
	FMPR	TT,YSC
	FIX	TT
	MOVEM	TT,$$$PY(T)
	ADDI	X2,1
	ADDI	Y2,1
	SOJG	T,LFL
	JSR	POLYUP
	move	12,ac12
	move	16,ac16
	JRST	@RETAD
SAVN:	0

POLYUP:	0			;ROUTINE TO FILL IN A POLYGON
	MOVEM	N,SAVN
	MOVEI	I,1
	MOVEM	I,$$$RNK+1		;PHASE 1, GENERATE AN
ILOP:	AOS	II,I		;INVERSE RANKING
	MOVE	T,$$$PY(I)		;KEYED ON Y VALUES
	MOVEI	J,1
JLOP:	MOVE	JJ,$$$RNK(J)
	CAML	T,$$$PY(JJ)
	JRST	NOXCH
	EXCH	II,$$$RNK(J)
	MOVE	T,$$$PY(II)
NOXCH:	CAIGE	J,-1(I)
	AOJA	J,JLOP
	MOVEM	II,$$$RNK(I)
	CAMGE	I,N
	JRST	ILOP
	MOVE	T,$$$PX+1
	MOVEM	T,$$$PX+1(N)
	MOVE	T,$$$PY+1
	MOVEM	T,$$$PY+1(N)
	MOVE	T,$$$PX(N)
	MOVEM	T,$$$PX
	MOVE	T,$$$PY(N)
	MOVEM	T,$$$PY
	
	MOVEI	I,1
	MOVEI	J,0
	MOVE	II,$$$RNK(I)
	MOVE	Y1,$$$PY(II)
NEWPNT:	HRLZ	X1,$$$PX(II)
	MOVE	T,$$$PY-1(II)
	SUB	T,Y1
	JUMPLE	T,TRYLOW+1		;FORGET IT IF THIS EDGE POINTS
	SKIPG	JJ,J			;UPWARDS
	JRST	HINS
HILP:	CAMG	X1,$$$LXS(JJ)
	JRST	HINS
	MOVE	TT,$$$LXS(JJ)
	MOVEM	TT,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS(JJ)
	MOVEM	TT,$$$DXS+1(JJ)
	MOVE	TT,$$$NS(JJ)
	MOVEM	TT,$$$NS+1(JJ)
	SOJG	JJ,HILP
HINS:	MOVEM	T,$$$NS+1(JJ)		;INSERT LINE SEGS
	MOVEM	X1,$$$LXS+1(JJ)		;COMING INTO THE SCANLINE
	HLRE	X1,X1
	SUB	X1,$$$PX-1(II)
	HRLZ	X2,X1
	HRRI	X1,400000
	ADD	X2,X1
	IDIVI	X2,1(T)
	MOVNM	X2,$$$DXS+1(JJ)
	ADDI	J,1
TRYLOW:	HRLZ	X1,$$$PX(II)
	MOVE	T,$$$PY+1(II)
	SUB	T,Y1
	JUMPL	T,DRAWG			;IF THIS EDGE POINTS
	SKIPG	JJ,J			;UPWARDS, TIME TO DRAW
	JRST	LINS
LILP:	CAMG	X1,$$$LXS(JJ)
	JRST	LINS
	MOVE	TT,$$$LXS(JJ)
	MOVEM	TT,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS(JJ)
	MOVEM	TT,$$$DXS+1(JJ)
	MOVE	TT,$$$NS(JJ)
	MOVEM	TT,$$$NS+1(JJ)
	SOJG	JJ,LILP
LINS:	MOVEM	T,$$$NS+1(JJ)
	MOVEM	X1,$$$LXS+1(JJ)
	HLRE	X1,X1
	SUB	X1,$$$PX+1(II)
	HRLZ	X2,X1
	HRRI	X1,400000
	ADD	X2,X1
	IDIVI	X2,1(T)
	MOVNM	X2,$$$DXS+1(JJ)
	ADDI	J,1
DRAWG:	CAML	I,SAVN
	JRST	DRAWM
	ADDI	I,1
SCNRE:	MOVE	II,$$$RNK(I)
SCNR:	CAMN	Y1,$$$PY(II)
	JRST	NEWPNT

DRAWM:	MOVE	JJ,J			;UPDATE EACH EDGE
	SETZB	T,II			;AND THEN
FLOP:	MOVE	X1,$$$LXS(JJ)		;MAKE UP DRAWING LIST
	MOVE	X2,$$$DXS(JJ)
	ADDB	X2,$$$LXS(JJ)
	JSR	FILIN
	SOSL	$$$NS(JJ)
	TRCE	T,1
	JUMPE	T,BLAR
	MOVE	X2,$$$LXS-1(JJ)
	JSR	FILIN
BLAR:	SOJG	JJ,FLOP
	
DRAWZ:	HRRE	X1,$$LOUT(II)		;DRAW THIS SET
	HLRE	X2,$$LOUT(II)
	JSR	HORUP
	SOJG	II,DRAWZ

NEXL:	MOVN	JJ,J			;REMOVE EXPIRED SEGMNTS
	HRLZ	JJ,JJ			;AND MAKE POINTS SORTED
	MOVEI	J,0			;AGAIN, IN PREPARATION
LPO:	SKIPL	$$$NS+1(JJ)		;FOR NEXT SCANLINE
	AOJA	J,NELP
SLOOP:	AOBJN	JJ,LPO
	JUMPLE	J,@POLYUP
	AOJA	Y1,SCNRE
NELP:	MOVE	T,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS+1(JJ)
	MOVE	TTT,$$$NS+1(JJ)
	MOVEI	II,-1(J)
FLOOP:	CAMG	T,$$$LXS(II)
	JRST	PFND
	MOVE	X1,$$$LXS(II)
	MOVEM	X1,$$$LXS+1(II)
	MOVE	X1,$$$DXS(II)
	MOVEM	X1,$$$DXS+1(II)
	MOVE	X1,$$$NS(II)
	MOVEM	X1,$$$NS+1(II)
	SOJG	II,FLOOP
PFND:	MOVEM	T,$$$LXS+1(II)
	MOVEM	TT,$$$DXS+1(II)
	MOVEM	TTT,$$$NS+1(II)
	AOBJN	JJ,LPO
	AOJA	Y1,SCNRE

FILIN:	0				;ADD A LINE SEGMENT
	HLRM	X1,$$LOUT+1(II)
	HLLM	X2,$$LOUT+1(II)
	AOJA	II,@FILIN

	END